import json
import os
from model_api import zhipu_api, qwen_api
from tqdm import tqdm

path_dir = os.path.dirname(os.path.abspath(__file__))

system_prompt = """
你是一位金融知识校验专家，专注于验证金融专有名词的解释准确性。你的任务是：
1. **深度思考**：分析原始解释，参考权威金融来源，避免使用非权威来源（如社交媒体、个人博客）。
2. **验证逻辑**：
   - 如果原始解释与检索到的权威来源基本一致，设置`verification`为`True`，`corrected`为`null`。
   - 如果原始解释有误或不完整，设置`verification`为`False`，并提供**修正后的解释**（和原本的解释格式一致，必须基于权威来源，确保无歧义、简洁、专业）。
3. **输出要求**：
   - 严格输出 **纯JSON格式**，无任何额外文本（例如，无"校验结果："等前缀）。
   - JSON结构必须包含以下字段：`verification`（`True`或`False`）、`corrected`（修正解释，若`verification`为`True`则为`null`）。
   - 修正解释需引用具体权威来源。
4. **修正后的解释的输出格式**：
    - 定义：一句话概括其核心含义；
    - 关键要素：列出1-3个构成该概念的核心特征；
    - 实际应用：简述其在金融市场或经济政策中的样例；  
"""

user_prompt = """
请校验以下金融专有名词的解释：
专有名词: 
{prop}
原始解释: 
{raw_desc}
"""


def get_verifice(prop, raw_desc):
    convs = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_prompt.format(prop=prop, raw_desc=raw_desc)},
    ]
    if 'qwen' in model:
        llm_ans = qwen_api.qwen_call(model=model, convs=convs)
    elif 'GLM' in model:
        llm_ans = zhipu_api.zhipu_call(model=model, convs=convs)
    else:
        raise ValueError
    llm_ans['prop'] = prop
    llm_ans['raw_desc'] = raw_desc
    return llm_ans


if __name__ == '__main__':
    # phase1_model = "qwen3-max"
    # model = "GLM-4-Plus"
    phase1_model = "GLM-4-Plus"
    model = "qwen3-max"
    with open(os.path.join(path_dir, "phase1_output", f"{phase1_model}_prop_desc.jsonl"), 'r', encoding='utf-8') as fp:
        lines = fp.readlines()

    with open(os.path.join(path_dir, "phase2_output", f"{model}_verify_{phase1_model}.jsonl"), "w",
              encoding='utf-8') as fp:
        skip = 0
        for idx, line in tqdm(enumerate(lines)):
            data = json.loads(line)
            prop, raw_desc = data['prop'], data['answer']
            if idx < skip:
                continue
            llm_ans = get_verifice(prop, raw_desc)
            llm_ans_str = json.dumps(llm_ans, ensure_ascii=False)
            fp.write(llm_ans_str)
            fp.write('\n')
